package com.yy.encap;

/**
 * chapter08  com.yy.encap
 * 2023-04-02 22:47
 *
 * @author yy yuyue
 * description : 不可描述
 * @date 2023/4/2 22:47
 */
/*
那么在Java中如何实现这种类似的控制?
请大家可一个小程序(com.yy.encap: Encapsulation01.java),
不你随便查看人的年龄,工资等隐私,标签队设置的年龄进行合理的验证.年龄合理就是设置, 否则就给默认
年龄, 必须在 1-120, 年龄, 工资不能直接查看,  name的长度在 2-6字符之间


 */
public class Encapsulation01 {
    public static void main(String[] args) {
        //如果要使用快捷键alt+r , 需要先配置主类
        //第一次, 我们使用鼠标点击的形式运算程序, 后面就可以使用
        Person person = new Person();
        person.setName("于越");
        person.setAge(30);
        person.setSalary(30000);
        System.out.println(person.info());
        System.out.println(person.getSalary());

        //如果我们自己使用构造器指定属性
        Person smith = new Person("yuyue",20,50000);
        System.out.println("=====smith的信息=======");
        System.out.println(smith.info());
    }

}

class Person{
    public String name;//名字公开
    private int age;//age私有化
    private double salary;//salary私有化

    //构造器 alt+insert



    //无参构造器
    public Person(){

    }

    //有三个属性的构造器
    public Person(String name, int age, double salary){
//        this.name = name;
//        this.age = age;
//        this.salary = salary;
        //我们可以将set方法写在构造器中, 这样就仍然可以验证
        //避免提供构造器(构造方法)绕开封装方法的麻烦
//
        setName(name);
        setSalary(salary);
        setAge(age);

    }


    //自己写setXxx 和 getXxx 太慢, 我们使用快捷键
    //然后根据要求来完善我们的代码.
    public void setName(String name){
        if(name.length() >=2 && name.length() <= 6){
            this.name = name;
        }else{
            System.out.println("名字的长度不对, 需要(2-6)个字符, 默认名字");
            this.name = "无名氏";//无名人

        }

    }
    public String getName(){
        return name;
    }


    public void setAge(int age){
        //判断
        if(age >= 1 && age <= 120){ //如果是合理范围
            this.age = age;
        } else {
            System.out.println("你设置的年龄不对, 需要在 1-120之间 ,给默认年龄18");
            this.age = 18;//给一个默认年龄
        }

    }
     public int getAge(){
        return this.age;
     }
    public void setSalary(double salary){
        this.salary = salary;

    }
    public double getSalary(){
        return this.salary;
    }
    //写一个方法, 返回属性信息
    public String info(){

        return "信息为 name=" + name + " age=" + age + " salary=" + salary;
    }
}
